package com.chenjj.java.test.jvm.gc;

import org.junit.Test;

/**
 * 所有测试用例的虚拟机参数：-Xms100m -Xmx100m -verbose:gc
 */
public class ReferenceCountingGC
{

    /**
     * 一个占用4M内存的大对象
     */
    static class  BigObject{
        public  static Object  staticInstance = null;
        private Object instance = null;
        private static final int _1MB = 1024 * 1024;

        /** 这个成员属性唯一的作用就是占用一点内存 */
        private byte[] bigSize = new byte[4 * _1MB];

        public Object getInstance() {
            return instance;
        }

        public void setInstance(Object instance) {
            this.instance = instance;
        }
    }

    /**
     * 测试一个引用和对象之间的关系
     * Object A = new Object() ， A为引用(指针,存在于栈中)，new Object()为对象(在堆中实际占用内存的)
     * Object B  = A ; B为引用(指针,存在于栈中)， B指向A指向的对象(在堆中实际上只有一个对象)
     */
    @Test
    public void  test1(){
        System.gc();
        BigObject A = new BigObject();
        BigObject B = A;
        B=null;
        A=null;
        System.gc();
        System.out.println(A);
        System.out.println(B);
    }

    /**
     * 测试JVM是否使用了引用计数器进行垃圾回收
     */
    @Test
    public void  test2(){
        System.gc();
        BigObject A = new BigObject();
        BigObject B = new BigObject();
        A.setInstance(B);
        B.setInstance(A);
        B=null;
        A=null;
        System.gc();
    }
}
